ホームに戻る
出典 :
添付プロパティの概要 - WPF | Microsoft Learn 添付プロパティを登録する方法 - WPF | Microsoft Learn WPF4.5入門 その45 「添付プロパティ」 - かずきのBlog@hatena View を支える添付プロパティ #C# - Qiita
関連 :
依存関係プロパティ ビヘイビア スタイル リソース [C#]拡張メソッド
目次 :

添付プロパティとは

DependencyObject を継承した別のクラスに対して、任意のプロパティ(依存関係プロパティ)を設定できる機構。 添付先の実装を変更することなく、依存関係プロパティを追加することができる。

添付プロパティの例

画像 Grid.Row 、Grid.Column や DockPanel.Dock は代表的な添付プロパティである。 これらは Button ではなく Grid または DockPanel に定義されるが、Button を含めた様々なコントロールに設定可能である。 既存の実装に手を加えず拡張できる点は拡張メソッドに類似する。

添付プロパティの定義

Sample.cs
画像 Sample クラスに添付プロパティを定義する場合の例である。 添付プロパティは依存関係プロパティとして定義するが、Sample クラスは DependencyObject を継承する必要は無い。 通常の依存関係プロパティは Register() メソッドを用いるが、添付プロパティでは RegisterAttached() メソッドを用いる点が異なる。 また、通常の依存関係プロパティではプログラム中からのアクセスを簡便に行うためのラッパープロパティを使用できたが、 添付プロパティでは対象の DependencyObject が自身とは異なるため、ラッパープロパティは使用できない。 代わりにラッパーメソッド( Get[プロパティ名]() 、Set[プロパティ名]() )を定義するのが一般的である。

添付ビヘイビア

添付プロパティの効果的な使用法としては「添付ビヘイビア」がある。
AttachedBehavior.cs
using System.Windows; using System.Windows.Input; namespace TestApp.Views.Behaviors { public class WindowAttachedBehavior { // ドラッグ移動を可能とする添付プロパティ DraggableAnywhere の定義 // (ラッパーメソッドを含む) public static readonly DependencyProperty DraggableAnywhereProperty = DependencyProperty.RegisterAttached( "DraggableAnywhere", typeof(bool), typeof(WindowAttachedBehavior), new PropertyMetadata(OnDraggableAnywhereChanged)); public static bool GetDraggableAnywhere(DependencyObject obj) => (bool)obj.GetValue(DraggableAnywhereProperty); public static void SetDraggableAnywhere(DependencyObject obj, bool value) => obj.SetValue(DraggableAnywhereProperty, value); // プロパティ DraggableAnywhere 変更時の処理 private static void OnDraggableAnywhereChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { // Window 以外のコントロールには適用不可 if (!(sender is Window window)) { return; } // 変更前が true ( true ⇒ false ) : ハンドラの適用を解除 if ((bool)e.OldValue) { window.MouseLeftButtonDown -= MouseLeftButtonDown; } // 変更後が true ( false ⇒ true ) : ハンドラを適用 if ((bool)e.NewValue) { window.MouseLeftButtonDown += MouseLeftButtonDown; } } // マウス左ボタン押下時の処理 private static void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // Window 以外のコントロールには適用不可 if (!(sender is Window window)) { return; } // マウスボタンが押されていない(離された)場合は何もしない if (e.ButtonState != MouseButtonState.Pressed) { return; } // 対象をドラッグ移動 window.DragMove(); // イベントを処理済みとする e.Handled = true; } } }
MVVM Toolkitに含まれる BlendBehavior 同様、コントロールの振舞いのみを分離できる。 (この添付ビヘイビアは、BlendBehavior 登場以前から存在していた実装法である。) コントロールのプロパティと同様に取り扱えるためスタイルとして登録でき、複数のコントロールに一括適用することができる。 一方 BlendBehavior は添付プロパティを定義する必要が無く、ビヘイビア自体の実装は比較的簡潔である。